package yi_run_zheng;

/**
 * @CLASSDESCRIPER: 使用单链表实现入栈与出栈 本次作业花费1小时
 * @AUTHOR:yirunzheng
 * @EMAIL:yrz_77@163.com
 * @DATE:2021\1\23 0023
 */
public class YI_RUN_ZHENG_23_Q1<T> {
    private int len;//栈内的长度
    private Node<T> head;//栈顶元素
    private int size;//栈的大小
    //创建一个Node容器
    class Node<T>{
        //设定Node的两个属性
        T t;
        Node next;
        //
        public Node(T t,Node next){
            this.t=t;
            this.next=next;
        }
    }
//    //创建一个空栈
//    public YI_RUN_ZHENG_23_Q1(){
//        //初始化 创建Node对象，也就是创建了一个空栈
//        head = new Node(null,null);
//        len = 0;
//        size = 0;
//    }
    //定义栈的大小
    public YI_RUN_ZHENG_23_Q1(int size){
        //初始化 创建Node对象，也就是创建了一个栈
        head = new Node(null,null);
        len = 0;
        this.size=size;
    }
    /**
     * 入栈方法 先判断栈是否已满
    * */
    public void into(T t){
        if (this.len==size){
            throw new RuntimeException("此栈已满");
        }
        Node top=new Node(t,null);      //新建栈顶元素
        Node before=head;                     //令初始节点为头节点
        while(before.next!=null){             //只要下一节点不为空就从头节点1个1个移动到之前的栈顶
            before=before.next;
        }
        //尾节点进行添加
        before.next=top;                      //之前的栈顶的下一节点为现节点
        this.len++;                           //栈内的长度+1
    }

    /**
     * 出栈方法：先判断栈是否已空 在判断len不为1时从栈顶删除1个元素 当len=1时令除头节点之外最后1个元素删除
     */
    public void out(){
        if (this.len==0){
            throw new RuntimeException("此栈已空");
        }
        if (len!=1) {
//            for (int i = this.len; 0 <= i - 2; i--) {//一次全部出栈
                Node before = head;                     //令初始节点为头节点
                for (int j = 0; j <= len - 2; j++) {    //循环找到栈顶元素前一个元素
                    before = before.next;               //从头节点1个1个移动
                }
                before.next = null;                     //令栈顶元素后一个元素为null
                this.len--;                             //栈内的长度-1
//            }
        }else {                                         //当len=1
            head.next = null;                           //令栈顶元素后一个元素为null
            this.len--;                                 //栈内的长度-1
        }
    }
    public static void main(String[] args) {
        YI_RUN_ZHENG_23_Q1 zhan = new YI_RUN_ZHENG_23_Q1(5);
        zhan.into(1);
        zhan.into(2);
        zhan.into(3);
        zhan.into(4);
        System.out.println("入栈后的栈长："+zhan.len);
        zhan.out();
        zhan.out();
        zhan.out();
        zhan.out();
        System.out.println("出栈后的栈长："+zhan.len);
    }
}